#ifndef _STDLIB_H_
#define _STDLIB_H_

typedef struct _link_node {
    struct _link_node * next;
    struct _link_node * prev;
} link_node;

#define LOCK(n)             do { (n)->lock++; } while(0)
#define UNLOCK(n)           do { (n)->lock--; } while(0)
#define LOCKRESET(n)        do { (n)->lock = 0; } while(0)
#define GETLOCK(n)          ((n)->lock)

#define NODE_NEXT(n)        ((__typeof__(n))nodenext((link_node *)(n)))
#define NODE_PREV(n)        ((__typeof__(n))nodeprev((link_node *)(n)))
#define NODE_HEAD(n)        ((__typeof__(n))nodehead((link_node *)(n)))
#define NODE_TAIL(n)        ((__typeof__(n))nodetail((link_node *)(n)))

#define NODE_ADDNEXT(n, p)  ((__typeof__(n))nodeadd((link_node *)(n), (link_node *)(p)))
#define NODE_ADDHEAD(n, p)  ((__typeof__(n))nodeaddtohead((link_node *)(n), (link_node *)(p)))
#define NODE_ADDTAIL(n, p)  ((__typeof__(n))nodeaddtotail((link_node *)(n), (link_node *)(p)))

#define NODE_DEL(n)         ((__typeof__(n))nodedel((link_node *)(n)))
#define NODE_DELHEAD(n)     ((__typeof__(n))nodedelhead((link_node *)(n)))
#define NODE_DELTAIL(n)     ((__typeof__(n))nodedeltail((link_node *)(n)))

#define NODE_INIT(n)        ((__typeof__(n))nodeinit((link_node *)(n)))

link_node * nodenext(link_node *);

link_node * nodeprev(link_node *);

link_node * nodehead(link_node *);

link_node * nodetail(link_node *);

link_node * nodeaddto(link_node *, link_node *, link_node *);

link_node * nodedelwith(link_node *, link_node *, link_node *);

link_node * nodeadd(link_node *, link_node *);

link_node * nodeaddtotail(link_node *, link_node *);

link_node * nodeaddtohead(link_node *, link_node *);

link_node * nodedel(link_node *);

link_node * nodedelhead(link_node *);

link_node * nodedeltail(link_node *);

link_node * nodeinit(link_node *);


void * malloc(size_t n);

void free(void * ptr);

int getbit(void * bmp, int n);

void setbit(void * bmp, int n);

void clrbit(void * bmp, int n);

#endif _STDLIB_H_ /* end of _STDLIB_H_ */
